#pragma once

#ifdef STOCK_ANALYZER_EXPORTS
#define STOCK_ANALYZER_API __declspec(dllexport)
#else
#define STOCK_ANALYZER_API __declspec(dllimport)
#endif

#include "stock_data_struct.h"
#include <string>
#include <vector>
#include "stock_analyzer_data_struct.h"

// 股票分析器类
class STOCK_ANALYZER_API StockAnalyzer {
public:
    // 构造函数
    StockAnalyzer(const std::vector<StockData>& stockData);
    
    // 分析指定日期的数据
    stock_analyzer_data analyzeDate();
    
    // 转存日期, 以解决因日期字串的指针失效从而引发的崩溃问题
    void copyDateString (const char* date);

    // 取回股票数据:
    std::vector<StockData> &getStockData();
private:
    // 获取指定日期在数据中的索引
    int getDateIndex(const std::string& date);
    
    // 判断是否放量洗盘
    bool isVolumeWash(const StockData& current, double ma60Volume);
    // 判断是否放量卖出
    bool isVolumeSell(const StockData& current, double ma60Volume);
    // 判断是否星线
    bool isStarPattern(const StockData& current);
    
    // 判断是否锤子线
    bool isHammerPattern(const StockData& current);
    
    // 计算K线实体大小
    double calculateBodySize(const StockData& data);
    
    // 计算K线上下影线长度
    double calculateUpperShadow(const StockData& data);
    double calculateLowerShadow(const StockData& data);

    // // 计算5日均价
    // double calculateMA5(const std::string& date);
    // // 计算10日均价
    // double calculateMA10(const std::string& date);
    // // 计算20日均价
    // double calculateMA20(const std::string& date);
    // // 计算20日均价
    // double calculateMA120(const std::string& date);
    
    // 计算均价
    double calculateMA(int period, const std::string& date);

    // 计算各级别的均量
    float calculateVolumeMA(int period, const std::string& date);
    
private:
    std::vector<StockData> m_stockData;  // 股票数据
    size_t m_innerData;// 隐藏结构
};

// 导出的C接口函数
// 创建分析器实例
STOCK_ANALYZER_API StockAnalyzer* createStockAnalyzer(const StockData* data, int dataCount);

// 销毁分析器实例
STOCK_ANALYZER_API void destroyStockAnalyzer(StockAnalyzer* analyzer);

// 分析指定日期的数据
STOCK_ANALYZER_API stock_analyzer_data analyzeStockData(StockAnalyzer* analyzer, const char* date);